package com.kang.gateway;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * 自定义年龄路由断言工厂
 * 根据请求中的 "age" 参数判断请求是否符合路由条件。
 */
@Component
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {

	public AgeRoutePredicateFactory() {
		super(Config.class);
	}

	/**
	 * 应用断言逻辑
	 *
	 * @param config 配置对象，包含最小和最大年龄
	 * @return Predicate<ServerWebExchange> 断言逻辑
	 */
	@Override
	public Predicate<ServerWebExchange> apply(Config config) {
		return exchange -> {
			// 获取当前请求对象
			ServerHttpRequest request = exchange.getRequest();

			// 获取 "age" 参数
			String ageStr = request.getQueryParams().getFirst("age");

			// 检查参数是否有效并转换为整数
			if (StrUtil.isNotBlank(ageStr)) {
				try {
					int age = Integer.parseInt(ageStr);
					return age >= config.getMinAge() && age <= config.getMaxAge();
				} catch (NumberFormatException e) {
					// 如果转换失败，记录日志并返回 false
					return false;
				}
			}
			return false;
		};
	}

	/**
	 * 定义参数的顺序
	 *
	 * @return 参数名称列表
	 */
	@Override
	public List<String> shortcutFieldOrder() {
		return Arrays.asList("minAge", "maxAge"); // 参数格式: age: 10,20
	}

	/**
	 * 配置类，定义断言的参数
	 */
	@Data
	public static class Config {
		private int minAge;
		private int maxAge;
	}
}
